import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../../common/services/index.dart';

class TestPermissionController extends GetxController {
  // 1. 静态常量（类级别）
  static const String tag = 'TestPermissionController';
  static const int maxPermissionCount = 10;
  
  // 2. 实例常量
  final String pageTitle = '权限测试';
  final Duration animationDuration = const Duration(milliseconds: 300);
  
  // 3. 响应式变量（Rx系列）
  // 基础类型 - 使用.obs写法
  var isLoading = false.obs;                   // RxBool - 页面加载状态
  var isInitialized = false.obs;               // RxBool - 初始化状态
  var hasPermissionError = false.obs;          // RxBool - 权限错误状态
  var testedPermissionsCount = 0.obs;          // RxInt - 已测试权限数量
  
  // 集合类型 - 使用.obs写法
  var permissionList = <Permission>[].obs;     // RxList<Permission> - 权限列表
  var permissionStatus = <Permission, PermissionStatus>{}.obs; // RxMap<Permission, PermissionStatus> - 权限状态
  var testResults = <Permission, bool>{}.obs;  // RxMap<Permission, bool> - 测试结果
  
  // 可空类型 - 特殊场景使用
  var selectedPermissionIndex = RxnInt();      // 可空整数，未选择时为null
  var lastTestedPermission = RxnString();      // 上次测试的权限名称
  
  // 4. 普通变量（非响应式）
  bool _isDataLoaded = false;
  String _errorMessage = '';
  
  // 5. 控制器和服务依赖
  late final PermissionService _permissionService;
  
  // 6. 构造函数
  TestPermissionController() {
    debugPrint('$tag: Constructor - 控制器已创建');
    _permissionService = Get.find<PermissionService>();
  }

  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 开始初始化权限数据');
    
    if (_isDataLoaded) {
      debugPrint('$tag: 数据已加载，跳过初始化');
      return;
    }
    
    _setupPermissionList();
    _isDataLoaded = true;
    isInitialized.value = true;
    _errorMessage = ''; // 清空错误信息
    
    debugPrint('$tag: 权限数据初始化完成');
    update(["test_permission"]);
  }
  
  /// 设置权限列表
  void _setupPermissionList() {
    final permissions = [
      Permission.camera,       // 相机权限
      Permission.photos,       // 相册权限（替代storage，适用于Android 13+）  
      Permission.location,     // 定位权限
      Permission.microphone,   // 麦克风权限
      Permission.notification, // 通知权限
    ];
    
    permissionList.assignAll(permissions);
    
    // 初始化权限状态为denied（未测试）
    for (final permission in permissions) {
      permissionStatus[permission] = PermissionStatus.denied;
    }
    
    debugPrint('$tag: 权限列表设置完成，共${permissions.length}个权限');
  }

  // 8. 业务方法
  
  /// 处理通用点击事件
  void onTap() {
    debugPrint('$tag: 通用点击事件');
  }
  
  /// 打开应用设置页面
  void openAppSettings() async {
    debugPrint('$tag: 用户点击打开应用设置');
    
    try {
      final result = await _permissionService.openAppSettings();
      
      if (result) {
        debugPrint('$tag: 成功打开应用设置页面');
        // Get.snackbar(
        //   '设置页面',
        //   '已打开应用设置页面，请手动开启所需权限',
        //   duration: const Duration(seconds: 3),
        //   backgroundColor: Colors.blue.shade100,
        //   colorText: Colors.blue.shade800,
        //   icon: Icon(Icons.settings, color: Colors.blue.shade600),
        // );
      } else {
        debugPrint('$tag: 打开设置页面失败');
        // Get.snackbar(
        //   '打开失败',
        //   '无法打开应用设置页面，请手动前往系统设置',
        //   duration: const Duration(seconds: 3),
        //   backgroundColor: Colors.orange.shade100,
        //   colorText: Colors.orange.shade800,
        //   icon: Icon(Icons.warning, color: Colors.orange.shade600),
        // );
      }
      
    } catch (e) {
      debugPrint('$tag: 打开设置页面异常: $e');
      // Get.snackbar(
      //   '操作失败',
      //   '打开设置页面时发生错误: ${e.toString()}',
      //   duration: const Duration(seconds: 3),
      //   backgroundColor: Colors.red.shade100,
      //   colorText: Colors.red.shade800,
      //   icon: Icon(Icons.error, color: Colors.red.shade600),
      // );
    }
  }
  
  /// 测试指定权限
  void testPermission(int index) async {
    if (index < 0 || index >= permissionList.length) return;
    
    final permission = permissionList[index];
    final permissionName = getPermissionName(permission);
    debugPrint('$tag: 开始测试权限: $permissionName');
    
    selectedPermissionIndex.value = index;
    
    // 更新权限状态为测试中（使用provisional表示测试中）
    permissionStatus[permission] = PermissionStatus.provisional;
    update(["test_permission"]);
    
    try {
      // 使用权限服务申请权限
      final result = await _permissionService.requestPermission(
        permission,
        showRationale: true,
      );
      
      // 更新权限状态
      permissionStatus[permission] = result.status;
      testResults[permission] = result.isGranted;
      lastTestedPermission.value = permissionName;
      testedPermissionsCount.value++;
      
      debugPrint('$tag: 权限测试完成 - $permissionName: ${result.message}');
      
      // 显示结果提示
      // Get.snackbar(
      //   '权限测试结果',
      //   '$permissionName: ${result.message}',
      //   duration: const Duration(seconds: 2),
      //   backgroundColor: result.isGranted ? Colors.green.shade100 : Colors.red.shade100,
      //   colorText: result.isGranted ? Colors.green.shade800 : Colors.red.shade800,
      // );
      
    } catch (e) {
      _errorMessage = '权限测试失败: ${e.toString()}';
      debugPrint('$tag: $permissionName - $_errorMessage');
      permissionStatus[permission] = PermissionStatus.denied;
      hasPermissionError.value = true;
      
      // 显示错误提示
      // Get.snackbar(
      //   '权限测试失败',
      //   '$permissionName测试失败: $_errorMessage',
      //   duration: const Duration(seconds: 3),
      //   backgroundColor: Colors.red.shade100,
      //   colorText: Colors.red.shade800,
      // );
    } finally {
      selectedPermissionIndex.value = null;
      update(["test_permission"]);
    }
  }
  
  /// 重置所有权限状态
  void resetAllPermissions() {
    debugPrint('$tag: 重置所有权限状态');
    
    // 重置所有权限状态为denied（未测试）
    for (final permission in permissionList) {
      permissionStatus[permission] = PermissionStatus.denied;
    }
    
    testResults.clear();
    testedPermissionsCount.value = 0;
    lastTestedPermission.value = null;
    hasPermissionError.value = false;
    _errorMessage = '';
    
    debugPrint('$tag: 权限状态重置完成');
    update(["test_permission"]);
  }
  
  /// 获取权限状态统计
  Map<PermissionStatus, int> getPermissionStats() {
    final stats = <PermissionStatus, int>{};
    for (final permission in permissionList) {
      final status = permissionStatus[permission] ?? PermissionStatus.denied;
      stats[status] = (stats[status] ?? 0) + 1;
    }
    return stats;
  }
  
  /// 获取权限显示名称
  String getPermissionName(Permission permission) {
    switch (permission) {
      case Permission.camera:
        return '相机权限';
      case Permission.microphone:
        return '麦克风权限';
      case Permission.location:
        return '位置权限';
      case Permission.photos:
        return '相册权限';
      case Permission.notification:
        return '通知权限';
      default:
        return permission.toString().split('.').last;
    }
  }
  
  /// 获取权限描述
  String getPermissionDescription(Permission permission) {
    switch (permission) {
      case Permission.camera:
        return '用于拍照和录像功能';
      case Permission.microphone:
        return '用于录音功能';
      case Permission.location:
        return '用于获取位置信息';
      case Permission.photos:
        return '用于访问相册和媒体文件';
      case Permission.notification:
        return '用于推送通知';
      default:
        return '应用功能所需权限';
    }
  }
  
  /// 获取权限图标名称
  String getPermissionIconName(Permission permission) {
    switch (permission) {
      case Permission.camera:
        return 'camera_alt';
      case Permission.microphone:
        return 'mic';
      case Permission.location:
        return 'location_on';
      case Permission.photos:
        return 'photo_library';
      case Permission.notification:
        return 'notifications';
      default:
        return 'security';
    }
  }

  /// 显示权限详细信息
  /// 
  /// 特别针对limited状态的相册权限进行详细说明
  void showPermissionDetails(Permission permission) {
    final status = permissionStatus[permission] ?? PermissionStatus.denied;
    final permissionName = getPermissionName(permission);
    final detailedDescription = _permissionService.getPermissionDetailedDescription(permission, status);
    
    debugPrint('$tag: 显示权限详细信息 - $permissionName ($status)');
    
    Get.dialog(
      AlertDialog(
        title: Text('$permissionName 详细说明'),
        content: SingleChildScrollView(
          child: Text(
            detailedDescription,
            style: const TextStyle(fontSize: 14, height: 1.5),
          ),
        ),
        actions: [
          if (status == PermissionStatus.limited && permission == Permission.photos)
            TextButton(
              onPressed: () {
                Get.back();
                openAppSettings();
              },
              child: const Text('前往设置'),
            ),
          TextButton(
            onPressed: () => Get.back(),
            child: const Text('了解了'),
          ),
        ],
      ),
    );
  }


  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit - 控制器初始化');
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady - 页面准备就绪');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose - 控制器销毁');
    // 清理资源
    permissionList.clear();
    permissionStatus.clear();
    testResults.clear();
    super.onClose();
  }
}
